package springboot.demo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springboot.demo.annotation.NotProfile;
import springboot.demo.service.impl.TransactionInvalidServiceImpl;


/**
 * spring事务失效的场景
 */
@RestController
@NotProfile("simple")
@RequestMapping("/tran")
@Slf4j
public class NoRollbackController {

    @Autowired
    TransactionInvalidServiceImpl transactionInvalidService;

    /**
     * 会回滚的方法，id为1时回滚SQL
     *
     * @param id
     */
    @GetMapping("/v1/rollBack")
    public void rollBack(int id) {
        log.info("id:{}", id);
        transactionInvalidService.rollBack(id);
    }

    /**
     * 内部调用，id为1时SQL不回滚
     *
     * @param id
     */
    @GetMapping("/v1/innerCall")
    public void innerCall(int id) {
        log.info("id:{}", id);
        transactionInvalidService.innerCall(id);
    }

    /**
     * 默认只回滚RuntimeException 和 Error，其他异常不回滚
     *
     * @param id
     */
    @GetMapping("/v1/rollbackForRte")
    public void rollbackForRte(int id) throws Exception {
        log.info("id:{}", id);
        transactionInvalidService.rollbackForRte(id);
    }

    /**
     * catch RuntimeException导致事务失效
     *
     * @param id
     */
    @GetMapping("/v1/catchException")
    public void catchException(int id) {
        log.info("id:{}", id);
        transactionInvalidService.catchException(id);
    }

    /**
     * 事务传播机制配置错误
     *
     * @param id
     */
    @GetMapping("/v1/propagationError")
    public void propagationError(int id) {
        log.info("id:{}", id);
        transactionInvalidService.propagationError(id);
    }

}
